# -*- coding: utf-8 -*-
__author__ = 'paul'
from five import grok
from plone.supermodel import model
from plone.directives import form
from Products.CMFCore.utils import getToolByName
from zope import schema
from z3c.form import button
from Products.CMFCore.interfaces import ISiteRoot
from Products.statusmessages.interfaces import IStatusMessage

from plone.app.layout.navigation.interfaces import INavigationRoot
from zope.interface import Interface
from zope.i18nmessageid import MessageFactory
from z3c.form import field, button
from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
from Products.bpChatCustom.interfaces import IChatTheme

_ = MessageFactory("Products.bpContents")







groupName='ChatResponsables'


def dameGrupoByName(nombre,context):
    """Dado un nombre devuelve un grupo, si no existe, lo crea"""
    acl_users = getToolByName(context, 'acl_users')
    groups_tool = getToolByName(context, 'portal_groups')
    gtool = getToolByName(context, 'portal_groups')

    if not acl_users.searchGroups(name=nombre):
        gtool.addGroup(nombre, roles=['StaffMember'])

    if not acl_users.searchGroups(name="Staff"):
        gtool.addGroup("Staff", roles=['StaffMember'])

    groups = acl_users.source_groups.getGroupIds()
    grupoChat=""

    for group_id in groups:
        group = groups_tool.getGroupById(group_id)
        if group_id == nombre:
            grupoChat=group

    return grupoChat

@grok.provider(IContextSourceBinder)
def potenciales_source(dic):
    """devuelve un vocabulario con los potenciales"""
    context=dic["contexto"]
    miGrupo=   dameGrupoByName("Staff",context)
    members = miGrupo.getGroupMembers()
    terms=[]

    for member in members:
        terms.append(SimpleTerm(value=member.id, token=member.id, title=member.getProperty("fullname")))

    return SimpleVocabulary(terms)


class IModFormManager(form.Schema):
    """
    Interface
    """

    potenciales =  schema.List(title=u"Potenciales moderadores",
                          required=False,
                          value_type=schema.Choice(source=potenciales_source)
                          )



class ChatModeratorForm(form.SchemaForm):
    """View for showing content related to a particular DAM code
    """
    grok.context(INavigationRoot)
    grok.name('moderadores_view')
    grok.require('cmf.ManagePortal')
    grok.layer(IChatTheme)


    schema = IModFormManager
    ##IgnoreContext te pone el formulario vacio por defecto, sin
    ##levabtar datos del entorno, default es False
    #ignoreContext = True


    label = _(u"Manejador de chat")
    description = _(u"Aca agregamos quienes figuran como receptores de chats.")

    def getContent(self):
        ##este metodo sobreescribe el metodo que viene en el  form para poblar de datos los campos
        ##antes de empezar con el formulario

        data = {}

        ##busco los moderadores actuales
        actuales            = self.dameActualesModeradores()
        data['potenciales'] = actuales

        ##aca paso el dato de contexto, por que si n lo pierdo
        data['contexto']    = self
        return data

    def dameActualesModeradores(self):
        """devuelve los moderadores que estan activos"""
        miGrupo=dameGrupoByName(groupName,self.context)
        miembros=miGrupo.getGroupMembers()
        ids=[m.getUserName() for m in miembros]

        return ids

    @button.buttonAndHandler(u'Ok')
    def handleApply(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        # Do something with valid data here
        grupo=dameGrupoByName(groupName,self.context)

        gTool=getToolByName(self.context,"portal_groups")
        idsMember=[m.getUserName() for m in grupo.getGroupMembers()]

        ##borro los del grupo que no estan en el formulario
        for elem in idsMember:
            if elem not in data:
                gTool.removePrincipalFromGroup(elem, groupName)

        ##agrego al grupo los que no figuran en el

        for elem in data["potenciales"]:
            if elem not in idsMember:
                gTool.addPrincipalToGroup(elem, groupName)

        # Set status on this form page
        # (this status message is not bind to the session and does not go through redirects)
        self.status = "Cambios aplicados correctamente."

    @button.buttonAndHandler(u"Cancel")
    def handleCancel(self, action):
        """User cancelled. Redirect back to the front page.
        """
        self.status = "No hubo cambios!"


